﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Drawing;

namespace Diagram
{
    [Serializable]
    public class ModelDiagramu : ModelUML.iDiagram
    {
        public List<DiagramStrokes.DiagramStroke> stroki;
        private Size rozmiar;
        public Size Rozmiar
        {
            get
            {
                return rozmiar;
            }
            set
            {
                rozmiar = value;
            }
        }
        public void UsunElementZDiagramu(ModelUML.iElementNaDiagramie e)
        {
            this.elementy.Remove((ElementNaDiagramie)e);
            ((ElementNaDiagramie)e).element.UsunElementZDiagramu(this);
        }
        public void UsunElementZModelu(Element e)
        {
            Model.UsunElementZModelu(e.element);
        }
        public ModelUML.iElementNaDiagramie GetElementNaDiagramie(ModelUML.ElementUML el)
        {
            ModelUML.iElementNaDiagramie iel = null;
            foreach (ElementNaDiagramie element in elementy)
            {
                if (element.element == el)
                {
                    iel = element;
                    break;
                }
            }
            return iel;
        }
    
        [OnDeserialized]
        void OnDeserialized(StreamingContext kontekst)
        {
            ModelDiagramu.model = model1;
        }
        
        String nazwa;
        public String Nazwa
        {
            get
            {
                return nazwa;
            }
            set
            {
                nazwa = value;
            }
        }

        public static bool dodawaj = true;
        public static ModelUML.Model1 model = null;
        public static ModelUML.Model1 Model
        {
            get
            {
                return model;
            }
        }
        private ModelUML.Model1 model1 = null;
        List<ElementNaDiagramie> elementy;
        public List<ElementNaDiagramie> Elementy
        {
            get
            {
                return elementy;
            }
        }        
        public ModelDiagramu()
        {
            if (model == null) model = new ModelUML.Model1("model");
            model1 = model;
            Nazwa = "diagram";
            elementy = new List<ElementNaDiagramie>();            
        }
        public ModelDiagramu(String nazwa)
        {
            if (model == null) model = new ModelUML.Model1("model");
            model1 = model;
            Nazwa = nazwa;
            elementy = new List<ElementNaDiagramie>();
        }
        public Klasa DodajKlase(String nazwa)
        {
            ModelUML.KlasaUML klasaUML = null;
            foreach (ModelUML.ElementUML el in model1.Elementy)
            {
                if (el.JestKlasa && el.Nazwa.Equals(nazwa))
                {
                    klasaUML = (ModelUML.KlasaUML) el;
                    break;
                }
            }
            if (klasaUML == null) klasaUML = model.DodajKlase(nazwa);

            Klasa klasa = new Klasa(klasaUML);
            if (dodawaj)
                elementy.Add(klasa);

            klasa.element.DodajElementDoDiagramu(this);
            return klasa;                
        }
        public void DodajPrymitywyC()
        {
            model.DodajPrymitywyC();            
        }
        public Notatka DodajNowaNotatke(String tekst)
        {
            ModelUML.NotatkaUML n = model.DodajNowaNotatke(tekst);
            Notatka notatka = new Notatka(n);
            if (dodawaj)
            elementy.Add(notatka);
            notatka.element.DodajElementDoDiagramu(this);
            return notatka;
        }
        public Asocjacja DodajAsocjacje(Element element1, Element element2)
        {
            Asocjacja aso = new Asocjacja(model.DodajAsocjacje());                
            aso.DodajZakonczenie(element1);
            aso.DodajZakonczenie(element2);
                if (dodawaj)
                    this.elementy.Add(aso);
                aso.element.DodajElementDoDiagramu(this);
            return aso;
        }

        public Asocjacja DodajAsocjacje(Diagram.Asocjacja dAso)
        {
            if (dodawaj)
                elementy.Add(dAso);
            dAso.element.DodajElementDoDiagramu(this);
            return dAso;
        }

        public Aktor DodajAktora(String nazwa)
        {
            ModelUML.AktorUML aktUML = model.DodajAktora();
            Aktor aktor = new Aktor(aktUML);
            aktor.Nazwa = nazwa;
            if (dodawaj)
            elementy.Add(aktor);
            aktor.element.DodajElementDoDiagramu(this);
            return aktor;
        }
        public Akcja DodajAkcje(String nazwa)
        {
            Akcja pu = new Akcja(model.DodajAkcje());
            if (dodawaj)
            elementy.Add(pu);
            pu.Nazwa = nazwa;
            pu.element.DodajElementDoDiagramu(this);
            return pu;
        }
        public Interfejs DodajInterfejs(String nazwa)
        {
            Interfejs inter = new Interfejs(model.DodajInterfejs(nazwa));
            if (dodawaj)
            elementy.Add(inter);
            inter.element.DodajElementDoDiagramu(this);
            return inter;
        }
        public void KopiujModel(ModelDiagramu d2)
        {           
            this.elementy.Clear();
            foreach (ElementNaDiagramie e in d2.elementy)
            {
                this.elementy.Add(e);
            }
        }
    }
}
